{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "95238086-8a73-40fd-852f-8580d40c1530",
   "metadata": {},
   "source": [
    "### 代码练习：最优KNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c0fd1be0-91cb-4a53-81d8-8bc19c396eb4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "当K= 1 的时候此knn模型的准确率为 0.91\n"
     ]
    }
   ],
   "source": [
    "#参考\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "df = pd.read_csv(\"knn_test_data\", index_col=0)\n",
    "\n",
    "# 1. 获取X和y\n",
    "X = df.drop('TARGET CLASS', axis=1)\n",
    "y = df['TARGET CLASS']\n",
    "\n",
    "# 2. 标准化df的数据部分内容\n",
    "X_arr = StandardScaler().fit_transform(X)\n",
    "X_std = pd.DataFrame(X_arr,columns=df.columns[:-1])\n",
    "\n",
    "# 3. Train Test Split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_std,y,test_size=0.30)\n",
    "\n",
    "# 4. 创建KNN模型\n",
    "K=1\n",
    "knn = KNeighborsClassifier(n_neighbors=K)\n",
    "knn.fit(X_train,y_train)\n",
    "\n",
    "# 5. 获得算法的准确率\n",
    "acc=knn.score(X_test,y_test) # <--- 判断此knn模型的准确率\n",
    "print(\"当K=\",K,\"的时候此knn模型的准确率为\",acc)\n",
    "\n",
    "# plt.plot(X,y,\n",
    "#         linestyle='dashed', color='blue', \n",
    "#         marker='o',markerfacecolor='red', markersize=5)\n",
    "        \n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "7e13cf05-b8e2-4edb-ab67-94c0a182bf11",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlMAAAEvCAYAAABhSUTPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABJrElEQVR4nO3deXxU1f3/8deZSUJIwhbCmiCLyE5MANnEulUggCS4tNTaWq21i7b19+0iLgUFq2L31tbWXbu4IqtEcMEVZQ2yqEEWkbCGNWTPzJzfH3dmmCxAFuCS8H4+Hnlk5s6dO585M3Pncz/n3DPGWouIiIiI1I/H7QBEREREGjMlUyIiIiINoGRKREREpAGUTImIiIg0gJIpERERkQZQMiUiIiLSAFFuPXBSUpLt1q2bWw8vIiIiUmurVq3aZ61tV9NtriVT3bp1Y+XKlW49vIiIiEitGWO2Hes2dfOJiIiINICSKREREZEGUDIlIiIi0gBnXTJVUlLCxRdfzFtvvcWECRPqtY1u3boxcOBA0tLSGDJkyEmOsG5ef/11evfuTc+ePXnooYdqXOfgwYNMmjSJ1NRUhg4dyvr168O3He+5/O1vf6N3797079+fX//61+Hla9euZcSIEfTv35+BAwdSWloKQHl5Obfccgu9evWiT58+zJo1K3yfl156iX79+tG/f3+uu+668PKvvvqK0aNH07dvX/r168eXX34JgLWWu+++m169etG3b1/++te/hu/zzjvvkJaWRv/+/bn44ovDyw8dOsQ111xDnz596Nu3Lx999NEZ8Vwuuugi0tLSSEtLo3PnzmRlZQGwYMECpk2bVuNrJiIijYi11pW/wYMHWzc88sgj9s9//rNdsmSJHT9+fL220bVrV5ufn3+SI6s7n89ne/ToYTdv3mzLyspsamqq3bBhQ7X1fvnLX9p7773XWmvtZ599Zi+77LLwbcd6Lm+//ba9/PLLbWlpqbXW2j179lhrra2oqLADBw60a9assdZau2/fPuvz+ay11k6dOtXefffd1lpr/X5/eLsbN260aWlp9sCBA5W2Za21F198sV28eLG11tojR47YoqIia621Tz31lP3Od75j/X5/pfscPHjQ9u3b127btq3atr773e/axx9/3FprbVlZmT148OAZ8VwiXXXVVfbZZ5+11lobCARsWlpajeuJiMiZBVhpj5HTnHXJ1IgRI+zWrVsrJVPLly+3aWlpdvPmzbXaRm2SqXnz5tmhQ4fatLQ0e/nll9vdu3dba50v2e9973t2wIABduDAgfaVV16x1lqbnZ1t09PTbWpqaqVk53iWLl1qR48eHb7+wAMP2AceeKDaeuPGjbPvv/9++HqPHj3C8RzruVx77bX2jTfeqLb8tddes9/+9rdrjCclJcUWFhZWW/6rX/0qnORE2rBhg73wwgtr3NYFF1xgv/jii2rL//73v4eTnEiHDx+23bp1s4FA4Ix7LiEFBQW2devW9vDhw+Flt99+u33xxRePez8REXHf8ZKps6qbr7y8nC1bthA5v9XSpUv50Y9+xNy5c+nRowdLliwJd8lE/o0cOTJ8H2MMo0ePZvDgwTz22GM1PtaoUaP4+OOPycnJYfLkyTz88MMAzJgxg1atWrFu3TrWrl3LZZddRn5+Pj/4wQ+YNWsWn3zyCS+//DLACWPZsWMHXbp0CT9mSkoKO3bsqBbL+eefz6uvvgrA8uXL2bZtG3l5ecd9Lhs3buT9999n2LBhXHzxxaxYsSK83BjDmDFjGDRoUPh5HTp0CIDf/OY3DBo0iGuvvZY9e/aE77Nx40YuvPBChg8fzuuvvx5e3rp1a6666irS09P51a9+hd/vB2Dz5s28+OKLDBkyhIyMDL744ovwfQ4ePMgll1zC4MGDee655wDYsmUL7dq148YbbyQ9PZ2bb76ZoqKiM+K5hMyePZvLL7+cli1bhpcNGTKE999/v8b3kIiINBLHyrJO9d/pqkz5fNbOn2/t9OnWPvPMDtu7d29rrbVLliyxPXr0sP3797c7duyo0zZD6+/Zs8empqbad999t9o6a9eutVdccYUdMGCA7dWrlx0zZoy11tpBgwbZjRs3Vlp33rx59rrrrqvzc3vppZfs97///fD15557zt52223V1jt8+LD93ve+Z88//3x7/fXX2yFDhoS7to71XPr3729/+tOf2kAgYJctWxau+vzud7+z3bp1s/n5+baoqMgOHz7cvvnmmzY/P98C4UrbH/7wB3v99ddba60dP368zcrKsuXl5XbLli02OTnZHjx40L788su2ZcuWdvPmzbaiosJeddVV9oknnrDWWhsfH29///vfW2utnTVrlh01apS11tpbb73VDhs2zBYWFtr8/Hzbs2dPm5uba1esWGG9Xq/9+OOPrbXW/uxnP7P33HPPGfFcQsaOHRveZsjixYvtVVddVefXXkRETi/O1sqU3w+TxhQx7Vu5FE+byR9vzeOrbSWECgadOnUiNjaWnJyc8H1qU5nq3LkzAO3bt2fSpEksX7682mP/9Kc/5bbbbmPdunX861//Cg9sttZijKm0bk3LahNLSkoK27dvD6+fl5cXji1Sy5Ytefrpp1mzZg3PPfcc+fn5dO/e/bjPJSUlhauuugpjDEOHDsXj8bBv3z5SUlK4+OKLSUpKIi4ujnHjxrF69Wratm1LXFwckyZNAuDaa69l9erV4W1lZmYSHR1N9+7d6d27N1988QUpKSmkp6fTo0cPoqKiyMrKqnSfq6++GoBJkyaxdu3a8PKxY8cSHx9PUlISX/va1/jkk09ISUkhJSWFYcOGAXDNNddU2pabzwVg//79LF++nPHjx1d6bUpLS2nevHm110xERBqPJp1MLVgA2z7M4+PCATxop7Cy6EJ8ZeXMneskNq1bt+a1117jrrvu4p133gHg0ksvZc2aNdX+li5dCkBRURFHjhwJX168eDEDBgwA4JFHHuGRRx4B4PDhwyQnJ+P3w/33P8u2bU48X//66PA64JxpN2LECN599122bt0KwIEDB2oVywUXXMAXX3zB1q1bKS8v54UXXmDixInV2uHQoUOUl5cD8MQTT/C1r32Nli1bHve5ZGVl8fbbbwNOF1Z5eTlJSUmMGTOGtWvXUlxcjM/n491336Vfv34YY7jyyivD7fjWW2/Rr1+/8LaWLFkCwL59+9i4cSM9evTgggsu4ODBg+Tn5wPw9ttvV7pP6PHfffddevXqBUBmZibvv/8+Pp+P4uJili1bRt++fenYsSNdunQhNze3xsd387kAvPzyy0yYMIHY2NhKr83GjRvDbS4ijYPf7+zPZ8xw/lfp0Zez0bFKVqf671R38/l81vbuUWZ/zUPOOPvg30CG2O99741KA9C3bdtm+/XrF+4iOp7Nmzfb1NRUm5qaavv162fvv//+8G233nqr/d///mettXbOnDm2e/fuNrHVCNs++ibbhe52UMLnNuPi3fY73/mu7d+/v01NTbWzZs2y1lq7cOFCm5aWZlNTU+3Xv/71Wj/P1157zZ533nm2R48elWJ59NFH7aOPPmqtdQaq9+zZ0/bu3dtOmjQpfCba8Z5LWVmZ/fa3v2379+9v09PT7VtvvRW+7d///rft16+f7d+/v/3Vr34VXv7ll1/aiy66yA4cONBedtll4TPuAoGA/X//7//Zvn372gEDBtjnn38+fJ/FixfbgQMH2gEDBtgbbrjBlpWVWWuds/bGjRtnBwwYYIcPHx7ulrTW2ocfftj27dvX9u/f3/7pT38KL8/JybGDBw+2AwcOtJmZmeHn6fZzsdY50y87O7va6zd+/Hi7du3aGl5ZETkT+XzWXnl5oR2U8LmdYh6ygxI+t1deXmiDJwJLE8ZxuvmMc/vpN2TIEHsqf5tvwQK4/do8WpXu4WOG4yHAfCZwk/fnpPR7mpycf+P1ntzHnDBhAq+++ioxMTHhGKZ9K5ePCwcQjY8KohiWsIHpz/ei6hRXoSOd4Nhzrr0WJkygUox+P2RnQ04OpKdDRgYn/TnI8UW+BqmpzvVXX4VAALp1gy1bYPdu6NgRevaE6GhIS3PWe+UVyMuD/fuhsBCaNdvDjh3XkZT0FvHxzvYLC48+VkKC87+oiGq3GwNdu8KFF8LWrc5jdu4M3/xm9ffNiZ6H3ksiJxbaR//hD5D/QS45NpWFZPAXbme5ZzgTr4nl3/+G4O6/kvJyuP9++OADSEoCjwd27XL2GwcPOp/nfv2gb18YMqR+n8eaPtPgxPzii7Bzp7Nf6tEDglPg0aOHs48aPFj7gNowxqyy1tY4uWSTTaZmzICCqb/jJb5BM0oopxmxlDGRubwY4yd11G3MWdzypLxhj7WNGTOgeNpMHrRTwsvuYCZ51/2a0BCpzExYtQqe+lsRgeJi4iginiI2cy7emGi6n+tsvKgIfAVFJJXmkVE2hzfis+g8NIWbfxbP2rXOFzvA2rUn98uxvl+6x7tfbbZZU9LyyiuwY8fRHRBA69Zw6NDR0mNNiQccPzGJvL24GM45x0lStm1zdnqhxBacMXjbP8ojtngfa0mlGRW0ZzfFNOcILYnCTxL5lBBHDGUksp/1pBJLKWCpIJpoKgBLKeuJwhBFfyqIIYoKfBG3VxBT6XLo9hgqaMceCkkIP2Y79tCKAlYxGG+zaHqe5yUzE6ZOrbxzLy+He++FJ/9aRJuiPBLZxyoGY2Kiad/BS0KCs2P3emHixOr3b6xCX4TPPw/r1zuvfdeucPvtzvPUl0jTE3mAGgg4n+uPPnL2F1de6by3AaZPh3nznPWtrXm/UFgIJfuKCJQUU0QCt/E3PqcPHzKKDuyhL+t5nXGUE0uvPl6MObqvCQRg18YCOtodlBJLIQkE8ODBj59oOrCbUmLxEUVLCthGNzxxsSS29VZ6/JAWLSAxkfB3iDHQvj2sfK+I2Pw8+tp1LPFeAfHxxNoySo+UEYWPJPIpJo5iEkhiLyXE0YwyBrCej2IuoUvfBN5fHlvt8151Xwwn/3umsTgrk6lQZapF6R5KiMMAa0k9WiGK38D0F6pXiI4nNKB9x7I8RhfNYXF8FsnDUpi9KL7GN9SCBfCbb+ayvNipTJUSQ1dPHlhoZ3czhtd5gpsBQwuOUEEUFigjttKXaAwVxFFMC46Qw6Dwtrp58+gQfYCxpXN51nsjiRxgYsBJtI4X16l6vrW5H5x4m5H3/3rhXJ7x3Ig/AIYAFvARQwd2s5+2wUc8duJxosSkaju3Zw8BvOwjiQ7sYTwLme/N4tyLncT13uty2Vccy2FaYYBO7CKBAr6gNy04QgsKSKCQAlpSTBwFtKIFRzAE8BFNFH6aUUYRcdUu+/DW6vZ27MWDjy/oTUuOkMRe9pFEMc3xE00ndjORucwjk+I2yXyxuyUxMU4i1bNDAYcPBejIruCOtXmldvARc8z7N1Z+P2SNLmLZkmLKbBQxVNCBPYxjIfPIouelKcx9o2GfFTmzhF7zFe8W09a/Gz9edtOp0nu7sFUyGCg5FDrQOfZ+o4JoWlCIv8pntBWH6cEmlnIhUfioaV9TQTTnsJ0WFLCLzhQRTwJF+PDSisMkUMCXdMeLHz+e4+6rDJW/rw2QxF520IVO7OJcNrGSIQTwUEYMJvjdEtov7aJz+PIRWtKTTeyiM1ewmLlk0eb8c3h/1bH3xafie6YxOV4yFXW6gzldMjLgl53b02PLx3zECL7Lc3gIsIDx5JBOj6K1rF5dt2QqOxt2LMsLd9tNL7yHYcs2kJ1d83YyMuCB81Lo98kGUlnL254riA8coQN7+JCR3MAztKQQPx5acZhCEignhpYUhj+szSmkPXuZwHxKaM5CMniRb7COVNr497HMn8YD3EU7/25WBxOtGRFxZWQc+6hi9GjnttCRW7duR8u/3brBhx/CvqV5rPHV/Hz9fpg7F/7yl6P3a9ECWrWCQ8vzWOVLZRFj2FrYhflvdwk/fuCzPO63U5jF1cQV7mLRW13p1Mkpcf/0p7B6NWx+17n/dH5DTKCEZjgD6IuIox27mcSr/JvvVmqnyMs+vMRRVqfb27OXu7mf/+MPdGYXSxnOg9yJx1/Kore9vLcS+hfvA84hCj9R+BjAet7mMppRRisO04fP+YgRdGcrX5FAPEW04jCJHGQ7XejCVxjgK86pdnl7Dctqur0je3gr+Jjd2EoAD+AhBh+t2U8OaSxiDNs4h3kHzyE93amAzpsH9tBh4vGQxH6+IoEYfJXaoR27w/ffSlfmHOxO27bQpk3lrsXIql3oPfbii0435oEDzm2hyhY4R//z5zvvjQ4dIDfX2eaoUU7lqyHdDMfq3ggtKymBte8exGs9tKSU9uzlQ0byJlcQRzFPv3cLCxbEk5lZ87ack0gqd9HUtVv1WDGvWuVc9nqdNhg9GhYvdpZXVMCmTQ1/rLNRdjZ8tvQgyf49/Ibp/JhH6RR8by8kg48YTu7h80hmF61rsd84QBu68yXb6cK1vMh8MomhnP6sZykX0oKiY+5rDtGK/qznI0bShoOUE0M3trKdc+jPepZwGS04QjS+E+6rqmrFYcbwOo9zCwNYzxrSSaCIAB78RBGFr9J+qQ0Hw5dHsJRNnMdKLnC+N5hK+mcbWLDAOdnn+eedSl5cXh5rAwNYSAav+8ewkiHVvmfq+ctsTUqTrUyB80X/w2v2Mcq3hC30oDM7j5uFn0hN3XZ3moeIn34H99xT830efxxuv6WIzuSxk2TSyGEkH/E5fVjEGIaxLPzl2J9Pa/zCHclSlnApW4JHL6EZLW7gGXLpy0oG8x3+zUzurBRX83vvYOV7NR9VLI7LYl90J8qPlNHWvztcjYmszBgsN/J0te3GT7+DO++EzCuK+GBJOV4q8BNNR3ZjsHzFOfyYf5BLH5ZzQfDL3lFEPF35igO0CR+FhSoFY8nmGW6khDh+zN/5nD68xdcZxCo8EN72tbzI09xEXz5rcGJStZ3nkMUBEvkuz/Iy36CY5oSOEMHgI5pBrOIAidV2UEu4lCh8fI33WMQY0lgTfm1bcIRyYk5KZcqPJ/yYn5DGHtqTxhq2B9vmc/qynAuweGjH3vDrWUwcg1hNR/bwejC+qu0Quv8yLqCM2EpdizVV7eZ5sihq2YmygjL8gUC1ylbo6L/0UCnt2MNeOmCA9uzB4sVimMg83kyo31FuTVXQzkNTANi5PI/LCufxCLcxmJXkBT9bI1nKZ/RjB8mMZjHzmYDp0YNVn8VzzbjK2+p0QQrr1vhpfnAHBks+SXiwtGcv41jIgmDVcs7i2scdijnv4zxKi/zhNngjPov9MZ1oW76LkiL/SXmss9WMGfDG1Pe5kA+Io5gn+T7X8iKf0ZcPGEUUPgpoxTCW1Wq/sZ/E8MFuaw7zW+7ixzxKAC9xFHHOcfY1ATxspDcX8w5vcxmXsoRPSKOIOHxE0549JHIwvH873r7K+bY2GCwWGM7HPM2NXMw7fMRIerCZXPrQh1wO0KbafultLiMKHxfxHosYy638g5kc/T77NTNZ2P1W9n5ZTLmNIhofN/EkD3A3/dlAJnMrrT/FPETCcb7/mpqzspsPnJ3WeV1Kidm1lRYUcISWPMQU1pHKQNZyX9zvmPFi7bPquXNh6uRcVpYOwALTmMafzC/p0CWWkSNh8uTqR4433AAfP5fL1bzCv/lujV+YoW6b3XSuVkYOXbZAOdE0o4JWHOZu7ucX/IFEDvIbpjODqXzISBYxhv/yLeaZSbRMiiXpQC4z/FP4Kz8jnw6sJp1FjOGP/B+b6ElH9lTaVqgy04oj3MdUZjCVjxke7h4dGr+B8bf34v33YcN7+2hOCT684R3ML/gDXgLh52+BAJ7wspqShFCl4H7u5jluIJoKAngoJfaYSUZtE4+TeXs79nKEBEqD46FiKKtUOo+nkC/oTSd24cdDKXHh1/ZLuuMhQBnNiMYHBILl/KOXo/DhI+qEt4OHFhTQggJ6sIV3uZQ2HKwUM1DtfTKG1/k33630PGrbDpFVu1YcYRlDWUgGv2EGh2hDc0opIo7WHA5Xtv7Lt5jFNXRiNx3YG3780LbuZRrTuI+XuYZ1pLKR3nRMiaFFixOPbSssPDpmJGFnbrgK+l++xWyupgdbeYApTOM+DtOm2vNrxeFKn5e5TCK2ZSydj+Sy1h49YaRL9G7aVOwNv7c9BEigiGUMZRFjeJ7JzCWLdl3iKu0rjjdGr6QEkvbn8ls7hfuYxlJG8CB38hzX05wKHmRK+HPUisO8xyge5E5mk0kufWmTFEO7dtW3X1TkPG7btpCSUr9KVtWKmTHO/y1bnIrcVVc56730kjP2rKDg6H1btoSBA2veD54M5eVHxzdZCwMGVH6s0O1z5zrVvGb78ugQ3L/9mEeJoaLe+wULFBKPxVBOMzqwB0OA7ZxDc0poTukxt5nEXvLoQlv2k0ABR2hFT75gBRdQRAJtOIghQDMq6r2vasVhWlDAVnqEY7FADGWV9kuRQxIMAdqzr9IJWjd4nqMVR6gIeGjNYR5kCjOYyp38ll/wR5LYH34/ziGTTfRm6EWx/OIXZ0fV9KxNpsDZsdjSI5jiMjqwl+aUMJrFLGY0JTRn8n39wl0RxxPZB5/o38Ne2gNUPnL0ZHHuJUePHP1+6JhYzg0Ff+YZbuRGnmIemRwgkd7kMoKlvMhkSoijHXsoIp5CEqp9ofqIIZ3V4f7y4XzM5/RhCZfyE/7Bg9xFFrNZzlD8GHzE0JHd7KMt7djHAdpQSItwtWhFsFrUm1xGstT5MiCfkXwYrszcxNM8wF1MYjZ5pHAFi1kQfRVH4jtSVlBGYaA5SezjnOCRU6j0nUQ+I/iI+UykLflspDd9yA3HHnlkFVkR+pR+LOFSzmcNB0hkO+fQlv18gxeZRyYeAhwgET+GQlryEx7hFb5BMXE0JDGp2s5prGYkH/E0N1arfI3iQ6ZyLz3YSgXReAiQyH5KaE4xCbQln2KaU0grktjDPtrhxYZf2wqiacUhttATT/DkgsiBquB84VrrfIkd6ws5EICivUV4y4tJIp/efMpbXEEM5RSRwBBWYrAM52PmMzH8mnxGHz5gFNH4SWIPe+iIwVZqh0JaMiSiirO9hqrd93gmvK1yYhhEDp6IqmFkZauEOIaxjJEs5Um+T18+C2/LQ4D9tKk2RvBEY9uiIiqh+2kbrND2CT9mBdHh6udBEvk5fw7GNJQymlFBDD/h75XuE00FJcRxK3/n4Ygj765s5RsR7+1cevM9nuHzYNU1VF2tyxg9p/L6DxYwkfHM52W+QRHNKaIFt/E35jORduTjwTKMj3iRyRRVGdtWdfuh8TRO1a9+layqFbNA8HMaqkRmkM3T3BgctxhV6Tkdbz94MoTG+xUfKq3xsV5aEE/vzgUUHSqtoZ2Ovrc7sCdcRQq1beQ+5Fj7DRM8GGxOKfEcYQs9iYmLZvRYL0vfLKK4oPyY+5oYfCSxh8O0IY5CfMQQQzkDWMebXIE1XprZEpy9o612/8iYimkefG8ncoQE4inmOzzLrOCJVnvpwM08HuwVGIrFkMj+8H6pHXsoIZZ8OnArj7CRPmwnhTKaEcDDftrSm1zy6MI3eYEHuJtMZvMWV3BrcND9B1xE1Gl4zc9EZ3UylZAA3YaWUFJgiFm1lRzSeJMrWM4QHuFWOvdvR1pazVMRRAoNJr+nuPLRbisOhys3pcTQO2oLXUckc/Cgc9QW2J5HM3v0qP233MX/8QcMkMjBcJY/j4lsohfjro7D64UNG5wvzvh4OHLE2U5s8Og/slJwH9NYyQUsJIPb+TOlxFYqQ8dQUe2IpmWwn/2/XE8MFcDRClKoGhSqFkUefbc/Jw6bl0dMwJn09FhHTjU9fk2qHvmFHj/y/okc5LfcFa5ivMrVrCEVH81YTRoPcidzmUgufejYJRaPp26JSeTtoXbuwJ5wFaVqBe1jhoerkn/kl3Q8J5YRI5xTjLdtc7bbtatzORAAnw82bnTGB114ITRrBoMGNfwsmNCZSq+84lyfONEZ5/O//4FvWx5+PDVWACPfb1/Qi/QRcRw5AocPO+1gLdjtefiC93ejAnii249VCT3e+/FotWwys7iWTuwmtspjAuGK1UIy+DO38wGj6MyuGtc93mOe7nYKfYZCVbPQKfvLzHAyr3VO2YejY9dat3bGq0VFHf0MfPopbHg1l/sDU7iXaYznNf7D9SRyiGUMDVeOK4InUkTGFFnpe57JzDdZDLkojv/7v4ZVx8rKnLFqn3wCLQu2h/dfd3M/s7ia7aSwnOF4m8fStmT7cSup0/kNj3ELzYPjjyKrfpH7kNDnoOp+I7Lq941vHH1eobGjf/2r87mPizt6n9C+JnSW8KhRzlQEgYDT9oMGHR27+tJLR89WPnDg6P4fju6rSkshMT+X3zKFv/EzNnMuiRxkKcOZyRRmk0k5zfmE1OBr8U0WeCYxeFRceKwjOMnpp3Ociu793M2rXE0mc3iCHxBLWfgzlkMaN/AMSxlF+4jqcuRr/iZXsJLBPBN9C395OZnMzDruzBqRszKZCn0gJ06EbmlltO7k5/KFj5BLH7aTzEESKSKBDuyudBQ3KzuexYurn7Z/333w4r2fEksJufRmEKsxwIV8yP3cwwLGcxe/ZQedAQ8d2M0eOnIzj7OAiYxjPrP4BrGU4CFAPu3wEKA9+YzjteMeRYaqYsvfKeZIoDnxFHMjT3M/93Aem4ilBC8+EjlIXsQAySTyMRDuX/+cPvQilwMkBqs8nkpVnv20rTSmawVDSSSfIhIoJgGw9CYXA4zkQzbQjw+4CC++8OnC85mIlwDNKCWPFG4IHsU7RzNHj/DASeCcs11iiKeI7/EM85hIJnN5kLvIZDYfchHt2YOXAAE8TGQub8RN4kCzjrQt382Y4tksip9EyrDkk3L2YvXqoyHyCNM5C+w15pLFeWfgWWCh5/D22xBHETfwDPOZyAESuZGnK1Vd7uAhWsyoPN6h6plvoaPiyKrdfCZSQizn8BUA+2jLAdqGq4aRla3hwaP//STxQ/4RfJ8lkcZqPFCvQfmRldDxzOdJfsAA1oUf0+FUVYbxES8xmeaUkMkc5pLFV95uxPsLwkfgXapUKpyxLFHh6kYhLcPv7SuZV6lyVJ8xeqHP4g08wzPBCmjkc2pLfvAz2paDtGEYy064fYLbDFUNQ6fs92M9bzKaEuJI8JQQFSgNVkoTqCCKCprRmoOUEcNeOoafp4cAX9GFOErClbglXEoaa6pVLQ0wgqVsoB/LGQoYktgbnqrDEzHtBhy/C9da2LO1iHZleZQQw2FaE01FeHzT0fdbYqUz30K3b4+oIsdRzBtcwYV8yIPchR8PmczmfS4iGl+l/e98TxY9G0FlJVw9XLaDKwrn8IznRgIBwvul+Z4silt1OuG+MbSd7R/vYHtRa9qxj+10CfcM7KctZTQjJlgNcyq5fVnCJaSxJvya1zT2cM3GM7sNG+KsS6YiB6VeXjiH+d4sDndMJm7/IVqW7sEbHJ8UqjSExkcMaraBFn2SKdtc/bT9++6Dl2d8xoNM4cc8WqnK05mdfEZf9tGWaHwksY8WFIQfI1RBWsoIZjKF9xlFjucCUi905rnq3Lnykc6xntOCBfCnPzlnuiWyn/uYyn1MJZYyNnMuzSivNm4mktPvnxAcTHz0yC1UJas6dupeptGMskqn04b65EOVK+cI/ud8wCh6sYUHcI5qpzONl7mGT0hjOlMrVZbySGalGUb3fnEkJsLnn0Oz/O3Vqm0eAswii5s8z5HUJZ5hw5yJ7SLPelqzxpkU82TOqxWq+Ph8zl9u7tGfiygudipPP//5mTs/kd8P06bBsw/mkRjYzzTuDR+hh87EqSCKwbEbeODlY08g+8ILsG6dU7ErLq55DEpkpSBUNTxEIoFgZStUDbuJp1hLGisZxE08xVJGHbfKcqLKVOR7vGpVNfK9H6o+zGQKHzCK9d40bv51W178Yx6BsvJq94n8jISOvu/kt9zHfcHPm1OxqVq1rEtlKfQ4CRQxngXhsZSR1bY24c/gfRyiTZ0rV604XOk0+SLiacvBSmP4fETRgb205HClsTY1bdMCB0gMn9Jf0+2hMZ0tOByeqqOu05NYDJ3YXauYTjTG7zdM55f8oVrvQS/vFlr2SQ5XmwYObFxnSoYKBWvWOLH7/TB7tnPbNdc4+8La7Bv9fqdI8M/f7qNZoCT83gx9nv/Cz8mnA1fxCq9yDTmk8T2e5kMuqlTJjfwOPdY+pak465KpmmYePz9mPYWJ3blg9zw+YgTnsplRwapSNhnkkE42YzkSk8Tq8gHhAXk/jn6Si7KS+PRTGLdhJi0opICEcF97BVF0Zjdp5PAWl9OcEoawgo8YyfX8m8/pF9En7WUic3kzfhIpw+tXSYmsngT8AS7iPb6kR3DsxbXspy0FtOI2/hbuNw9w9EeUi4knnRwuCp7lUkg8c8liYrAalMVsVgTvcxHvhU/n7cPnbKU7hcTjJcBBEkliH+N4jXlkEtWtC917QN6yHZQV+Qjg4Urm8W/Pjfit4Sb7RI1nBd5zj/OBLrz34WDV8OS11dms8jw7ewjgYR/twkew9RlPE7k9Px520anaEf484xwZlx4qo4yocDVvLAt5lhtJ8hzgysBcng3OHVbTGJMTjW2LiqiELmAiE5gXHP80NDzAP1QBdcYQVa7+zsqO5+oMp9LrDxx9zBKak05OpWpVqPI8idnB92Yse2hH+2D1yI+p8xi9yNiSyGcv7bEY/ETRgT14CIRfq9Fk8yQ3n3D7oXFgC4JVwyGs4BPSASdx20MH0smpdHbpEVpwKUv4iBFEUxEeG9aW/OD5t0fH3XnwYwjQjS9ZwQWU0axSTIXBsXoeLH48fEXXenVdFhFXKaaq45v2kcQgVleqCtZUVYzBFzz7tGHv+6ZuxgxYPPV9wOlt+JR+rGAoSeyjNQcZydJwD0hzShjPPJ7gB+HPS9Uxhk397L6zLpmaMQOKps3kIVu5SyPvujt46yVnqoQ1pIerSqHpEp7kZm7iqYiB18mU0Jx8kqggms7sDp/d8B6j+C138Rdu58c8ygt8i2EsYykj8RHNxbzDVnqE+5RXMJhHPT/jislt+da3GlZJCVUO/vxn54y6mwKPBwdH31fpiCI0TuR5vsl8M4nu/ZzO/MOf5tHe7gmfBVi1GjSHidzg+Q/NbQkX2yXh02lv4ilG8BG/YTrTuI85XEUAw0fNLuVPLyYzYYJzxLR6tVPRiYqC88+HFStg7u9yWV1e88/qhJLfDwtTw231r6ifcfk3Gt5WZ7PIKlsgcHQsl8fjHMHWZyxL5Pa6dHHmofnqq8pH+KF5p0KVraIi57Fvu80ZL7Ju3dEj6lmzKv/ETuSZaccb+5afD4n7cnkgeEbcMoaFx0TN5SpatYulfXtnpmiPB5KTq49zWbDAGacSevy9e6FZ/tHxYpFjIkMHVz/0PknvkUkc+DiX+yqm8CpXs51kljGClkmxNG9euzF6oVmsPR5n3q1AwKnQFhQ4Z8X16eO0VWgm+pwcJ95Dh2re/pEjEJfntEfolP0+fAY43X/n8QXbOYfQtBqJHOQAbcinHV/jPT7kwhrHoYXOCP0+T3ILj/MAd7GA8bzAN3mDKyhu3p6kJKf9koq/JBpfpak66tqFe4DESjFFvg6hCmdNVc3I8U9zmMjn9COxXQx9+8LIkc57tL7v+6YsNLk1paWVxr29yDeYa66iR9R2Vlc4Z6/fx1T+6v0/xk6Kp0cP+NdfSulUtrXBk2E3JmddMrVgAUz9Zi7Lio9+eac1W88DL/bmgWmlHP5kK+eymQ+4kM7sZi2peAhwD9N5lat5kDvDAzBDg7RDidcOksOVk/6sZznDKp2G2p0tvMelpLCdnmxiJ8mMZhFzmETi+V3qNK/Vifj9MHJwKQWfOAPrv8HL5JHCZbzJc8apAkwMzGFxRL85VK4wWDz4g1MXBPCQyVzeiJ9E8rBk9uzzUrB2a/h02s7sqvQ4X+cNXo+dRLcLj185iuznH1NUvR//RLeLVBU55iNUCQ29dxta9Q2NFzvWuJpZ2c58VGfS+zWyPUqKfGznHBIjpssIzZJfQGtaUIAhQAwVHCCRDuyhB5v4iFG0D1bG8mmHCda025FPAS2Jp5h1DDxa7feu58FZvcnMdAZg33JVPgT8HCGBtlWm6qhtZSqGskoxLQ3OCRV6HcaykGe4Mfisj1boGuP4pzNB5HhcG6g8hrfH11IwBnYsr/4+z852pgnqXLSRnSTzdRbzP76Np2MH/vbPmCabsJ51yZTfDxMvL+KLd3eQxWwWRGdR0aMDn29ojd8PF19QxBdri6kgih/wOCNZyi/5AwW0wOCcodOVr9hOF9JYgwcbLvdnk8Fq0nmdsezufiHXbH2YeRFdDV/SlXPZyFuMoSO7SWUtH0VfQpd+Nf/uUUOVl8MlQ4so+GwH48rnMKvZt4lObscDv4vB63WqAFX7zatWGLp3d6pIkWeYhGZ+vmRoEYc27KDQF00hrYKTNc7nRc91xHdtz8w/1e6DE9nPX1M//oluF6kq9J6JrIQ29EzJquPFCgudKlLVcTVn4vs1sj2Ki+G5fxZx6DD8hL+zkT58RQrNKWYd59OM0uB0JZYAUbRnL33ZwCIy8MbFMnacF6/Xma8JnOrZumVFsGMHV/pmkx07ia4jkytNA5M1uogNHx4ipuwgO+hCDOV1np4kdDkyptfJgJhYzj3PS2qqU12C6lXNml4nObHIKu3OnZXH8ELN7/PQBNb327uYy5X8ij8QQ3mDJuBtDM66ZAqcnWt0tHP5/NHFDL6ylCdvSwSco6h7rs3l3oop/IR/UE4z4imiJQXczz01TvBW00C7rF/14rU/5XJ34dGuhje5glUM4tlmP+S6XyYTG3vqd7ancsceuYMuL4etW1UuF2kMQicizJ7pnAIf3jfF/JDJv0hm2zbnVPxQ12PVrtCatlfbA6J+/WDlyuN3TcKxpy851jQEcmaIHJpxMe9RQMuzorvvrEym4OgMyWN+fIQuAyp4/CdOMhXKqofbD7mNv+EnijYcZAKvkUAhi7kCgicxh077tphKg2zPu/Rouf9kdjWIiJws6kKXUyH0vtrw4SGOlEZxE0/xEHeFb2+qA9HPyh86Bmjf3hlU6o2pnDCmp8O0+CyaFRbTjW3hM1xeYxz3cw/PckN43ZYc5h/8mFe5mh0k85jnx9x2Z0vuu885UnL6j3tFdDX0YfpJmJRRRKShIvdRa9bcwfQ07Zuk4ULvqxtuiKfkv6/wBqOZwdRwZWpB9CQeSnM7ytOrSVemXn/d2XFc+YsCOvTwhStTkVm1r7SCtuzHg49tdCeFPEppRj7twwMwazOxpoiIyNlkwYLKA9FHs4jZTMJ068agEc4vUpzo10Uak+NVpjynO5jTqdT51ROioisnjKGs+o8vJNOiezvyzDkUE08cReylPW3Zj9frIaZ9In2/1oGkiwew47o7eHBWbyVSIiIiOMWKlOEp7IjvTTe28Hd+wk6Twt4vi1nz/Kd0/u9M7rw6l6zRReGJj5uqJl2Z+tnPnN90Ou/aAxgP4cpUpJrObIuJOTm/nyYiItKUhb5Dvz+5iPJSHwZLZ3ZVGpDeVGZGPyvHTPn9zg93rlkDsf2iSelfUeN6Xi9kZtKkf5xRRETkVAgVHJqXHyRAc6LwkckcLDCVe/mQUSSU5rNyZeNPpo6nSVamQmOivliSx5WBObwWk0l59458vqG1Kk0iIiInid8P/XuVk7RlGQdpQx8+Zwvd2U8S8RQzkbnMI5PDCcl8ub/lSZ9r8XQ668ZMZWfDjmV5rA0M4GGmsKZ8IDFf7iE72+3IREREmo7sbPDt3MtuOlFKLJ/Sl0ISiKeYtaQykztZSyotC3dy//1uR3vqNMlkKicHRhfNCc6mC9H4mFA2hzVr3I1LRESkKcnJgatL/0dfPqWQBPaTxE6SmcjcSt/Bmcxh6VKXgz2FapVMGWPGGmNyjTGbjDFTari9jTFmtjFmrTFmuTFmwMkPtfbS02FxfBYVwSFhFUSxoFkWaWluRiUiItK0pKfDmwmZvMy1PMYtXMablBPDPDIrfQfPJYuRI10O9hQ6YTJljPECfwcygH7At4wx/aqsdhewxlqbCnwX+MvJDrQuMjIgeVgKwxI2cKd5iLRm6ynv1oGMDDejEhERaVpC37cjE9bxsbmQjQkXMObSCorbJDOAdVzFS7RlH9uje3D++TTZKRJOOADdGDMCuNdaOyZ4/U4Aa+2DEeu8Bjxorf0geH0zMNJau+dY2z3VUyNE/k7U+zuOkNK/IvzbfCIiInJy1PS7jeXlMKRvEXu3FdOB3YxnIfMb+cTXDR2Angxsj7ieF1wW6RPgquCDDQW6Ail1D/Xk8XqdWVfvuQfOGViBp0mODhMREXFX5PdtaLbzt96Csj0HOYevyGEQM5nCJ/4BbFu6o0meDFabFMPUsKxqOeshoI0xZg3wUyAHgiPPIjdkzC3GmJXGmJX5+fl1jVVEREQagZwc6Fy6ldEsrjQQPaN0dpM8Gaw2yVQe0CXiegqwM3IFa22BtfZGa20azpipdsDWqhuy1j5mrR1irR3Srl27+kctIiIiZ6z0dNgZ253FjK40ED07dlKTPBmsNsnUCuA8Y0x3Y0wMMBmYF7mCMaZ18DaAm4H3rLUFJzdUERERaQwyMqDvyDbs8J5DGjlczct0NruI7XUOo0e7Hd3Jd8JkylrrA24DFgGfAS9ZazcYY35kjPlRcLW+wAZjzOc4Z/39/FQFLCIiImc2rxfmLI7nHy+1Iz++O+sZyPd5Ev+WbVwzrun98HGtfpvPWrsQWFhl2T8jLn8EnHdyQxMREZHGyuuFmBjo6MtjFQPw2ADDC5fyk/ee5L774pk2jUZ5Vl9NmuwPHYuIiIi7Vq2CjLI5eAgwidnsIJnvVDzB7JmTWLM0hdmLGuc0CVVpwgARERE5Jfx+mMdE5jKRbZzDxwxnJneyunwAecuazjQJSqZERETklHCqTpbv8hxjWISHAAsYz0NMoUfhWlavdjvCk0PJlIiIiJwSgwdDebOWtCOfN/k6mcxhGvdRRBwb6M/rrzaNwehKpkREROSUyMiA6OT2XM0rRONjMz35mOE8xF2sJZXSTU2jq0/JlIiIiJwSXi/M/GMMb8RmMpZsMplbaUb0McVNY0Z0JVMiIiJyykyYAF0vTOE/sT9gAeOpIAo/HuYwkWejvk95OY2+q09TI4iIiMgp4/XC7EXxzJ0bz82TWzCgYh1eAlgM11c8yWt/ymr00ySoMiUiIiKnVGgCzxTPLq7hZbz4WUsqDzOFjwsb/zQJSqZERETklMvJgXHlc4ihgvG8VnnsVFHjHjulZEpEREROufR0WByXxQLGM5dMKoIjjSqIYlHcJNLS3I2vIZRMiYiIyCmXkQHRPbtyhJacyyaGsYwpPMBA1hHbM5mMDLcjrD8lUyIiInLKeb0wblIsWWYec8liOlNJoIiBrGfsVY138DkomRIREZHTZPBgeCM+iwAeJvAadzCTzQmpDBrkdmQNo2RKRERETouMDEgelsKwhA38mpn0jPqS4vbd8Psb91xTSqZERETktAjNOTXtP714Nv5WmvsKydr6J6Zfn8ukMY33d/qUTImIiMhp4/U6f+3K81jHAB6yjX+uKSVTIiIiclrl5MD4ijlNZq4pJVMiIiJyWqWmwoKorMpzTcU33rmm9Nt8IiIictr4/fDEX4vI9yeSTg7jeI0F3izOHdp455pSMiUiIiKnTXY27Fyex1c2lTe5glUMoiw6gZt/1njnmlI3n4iIiJw2OTkwumgOsZQzgdeYxgyuLfsP69a5HVn9KZkSERGR0yY9HRbHVx4vtbgRj5cCJVMiIiJyGkVO3DnFPMSgZhvofEHjHS8FSqZERETkNApN3Dn9+V58OuEO1pf14l//brzjpUDJlIiIiJxmXi9MmABZWc51n8/VcBpMyZSIiIi4olkz539ZmbtxNJSSKREREXGFkikRERGRBoiJcf439mRKk3aKiIiIKy69FD77DLp1czuShlEyJSIiIq5o0QL69HE7ioZTN5+IiIi4Yvdu+OMfYcsWtyNpGCVTIiIi4oodO+AXv6BR/5QMKJkSERERl4TO5isvdzeOhlIyJSIiIq7Q1AgiIiIiDaBkSkRERKQBmkoypakRRERExBVJSbB9OyQmuh1JwyiZEhEREVd4vdCpE2RnQ04OpKdDRoazvDFRMiUiIiKu8PkgvVcR3t15ZJTOYVp8Fo8NS2H2ovhGlVBpzJSIiIi44vXXoXxrHitKBvCgncLHhQPIW7aD7Gy3I6sbJVMiIiLiilWrIJM5ROMDIBofY4pms2aNu3HVVa2SKWPMWGNMrjFmkzFmSg23tzLGzDfGfGKM2WCMufHkhyoiIiJNhd8PC2eXMo+JVARHHVUQxaK4SaSluRtbXZ0wmTLGeIG/AxlAP+Bbxph+VVa7FfjUWns+cAnwB2NMzEmOVURERJqI7Gyo2LSNnmxiGMuYwgMMZB2xPZPJyHA7urqpTWVqKLDJWrvFWlsOvABkVlnHAi2MMQZIAA5AsGYnIiIiUkVODowpnsNcspjOVBIoYiDrGXtV4xp8DrVLppKB7RHX84LLIj0C9AV2AuuAn1trAyclQhEREWly0tNhcXwWATxM4DXuYCabE1IZNMjtyOquNsmUqWGZrXJ9DLAG6AykAY8YY1pW25AxtxhjVhpjVubn59cxVBEREWkqMjIgeVgKw+I3MMU8xND4DaQMa3xdfFC7eabygC4R11NwKlCRbgQestZaYJMxZivQB1geuZK19jHgMYAhQ4ZUTchERETkLOH1wuxF8WRn92LNmjuYkdY4J+yE2lWmVgDnGWO6BweVTwbmVVnnK+ByAGNMB6A3sOVkBioiIiJNi9cLo0dDXBx06NA4EymoRTJlrfUBtwGLgM+Al6y1G4wxPzLG/Ci42gxgpDFmHfAWcIe1dt+pClpERESahooK+MUvYMkStyOpv1r9nIy1diGwsMqyf0Zc3gmMPrmhiYiISFMXFcxE/H5342gIzYAuIiIirgl17fka8YRKSqZERETENaFkSpUpERERkXowBjyexl2ZqtWYKREREZFTZds2aFltdsrGQ8mUiIiIuColxe0IGkbdfCIiIuKqmTPh9dfdjqL+lEyJiIiIq2bOhOxst6OoPyVTIiIi4iqvt3EPQFcyJSIiIq5SMiUiIiLSAFFRmmdKREREpN4ae2VKUyOIiIiIq9atg5gYt6OoPyVTIiIi4qrGPGEnqJtPREREXPb738Nzz7kdRf0pmRIRERFXPfsszJ3rdhT1p2RKREREXNXYB6ArmRIRERFXaWoEERERkQZQZUpERESkAbzexl2Z0tQIIiIi4qoPPgBPIy7vNOLQRUREpClozIkUKJkSERERl/3lL/DQQ25HUX9KpkRERMRV2dkwe7bbUdSfkikRERFxVWMfgK5kSkRERFyleaZEREREGkDzTImIiIg0QFwcxMa6HUX9aZ4pERERcdV//uN2BA2jypSIiIhIAyiZEhEREVf961/w05+6HUX9KZkSERERVy1frnmmREREROpNUyOIiIiINICmRhARERFpAM2ALiIiItIAbdpAu3ZuR1F/SqZERETEVdOnQ26u21HUnybtFBEREVf5/ZCdDTk5kJ4OGRlO119joWRKREREXOP3w4jziyj8PI/MwBymxWfx2LAUZi+KbzQJlbr5RERExDXZ2VCyMY9P/AN40E7h48IB5C3bQXa225HVnpIpERERcU1ODoyrmEM0ztwI0fgYUzSbNWvcjasulEyJiIiIa9LTYWFMFhXBkUcVRLEofhJpae7GVRdKpkRERMQ1o0fDkVYp9GcDd/AQw+I3kDIsmYwMtyOrvVolU8aYscaYXGPMJmPMlBpu/5UxZk3wb70xxm+MSTz54YqIiEhT4ffDNeOKSDiYx0DW8mzUTUT3PIdXFjaewedQi2TKGOMF/g5kAP2Abxlj+kWuY639nbU2zVqbBtwJvGutPXAK4hUREZEmIjsbdizLI8c3gFlcy3ZfZyo2f8XixW5HVje1qUwNBTZZa7dYa8uBF4DM46z/LeD5kxGciIiINF05OTC6qHEPPofaJVPJwPaI63nBZdUYY+KAscCshocmIiIiTVl6OiyOb9yDz6F2yZSpYZk9xrpXAh8eq4vPGHOLMWalMWZlfn5+bWMUERGRJigjA5KHpTAswRl8PtA0vsHnULtkKg/oEnE9Bdh5jHUnc5wuPmvtY9baIdbaIe0a8y8aioiISIN5vTB7UTzTn+9F9sA7ONKpV6Oa+TykNj8nswI4zxjTHdiBkzBdV3UlY0wr4GLg+pMaoYiIiDRZXi9MmACHD8P27Y3rN/lCTphMWWt9xpjbgEWAF3jKWrvBGPOj4O3/DK46CVhsrS06ZdGKiIhIk/Ttb7sdQf3V6oeOrbULgYVVlv2zyvVngGdOVmAiIiJy9igpAZ8PWrRwO5K60wzoIiIi4rof/hBSU92Oon6UTImIiIjrPB6wx5or4AynZEpERERcZwwEAm5HUT9KpkRERMR1qkyJiIiINIDH03grU7U6m09ERETkVJo4Efr2dTuK+lEyJSIiIq678kq3I6g/dfOJiIiI6w4dgp3H+rG6M5ySKREREXHdXXfB+ee7HUX9KJkSERER1+lsPhEREZEGaMxn8ymZEhEREddp0k4RERGRBmjM3XyaGkFERERcl5kJ557rdhT1o2RKREREXHfJJc5fY6RuPhEREXHd3r2Qm+t2FPWjZEpERERc9/vfQ1qa21HUj5IpERERcV1jHoCuZEpERERcp3mmRERERBpA80yJiIiINEBj7ubT1AgiIiLiusxM6NrV7SjqR8mUiIiIuG7IEOevMVI3n4iIiLhu505YsaJxdvUpmRIRERHXPfEEDB3aOAehK5kSERER13mCGYkqUyIiIiL1EEqmVJkSERERqQdjnP9KpkRERETqoTF382lqBBEREXHdxInOPFPR0W5HUndKpkRERMR1ffs6f42RuvlERETEddu3w9tvg8/ndiR1p2RKREREXPfKK3D55VBU5HYkdadkSkRERFyns/lEREREGqAxn82nZEpERERcp8qUiIiISAM05sqUpkYQERER140fD926QcuWbkdSd0qmRERExHXdujl/jZG6+URERMR127bB3LlQUuJ2JHWnZEpERERct2gRZGXBgQNuR1J3SqZERETEdY15AHqtkiljzFhjTK4xZpMxZsox1rnEGLPGGLPBGPPuyQ1TREREmrLGPDXCCQegG2O8wN+BK4A8YIUxZp619tOIdVoD/wDGWmu/Msa0P0XxioiISBPU1CtTQ4FN1tot1tpy4AUgs8o61wGvWmu/ArDW7j25YYqIiEhT1pgrU7VJppKB7RHX84LLIvUC2hhj3jHGrDLGfLemDRljbjHGrDTGrMzPz69fxCIiItLkjB0L77wDHTu6HUnd1WaeKVPDsqpFuChgMHA50Bz4yBjzsbV2Y6U7WfsY8BjAkCFDGmEhT0RERE6Fjh0bZyIFtatM5QFdIq6nADtrWOd1a22RtXYf8B5w/skJUURERJq6L7+E//wHCgrcjqTuapNMrQDOM8Z0N8bEAJOBeVXWmQtc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\n",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#参考\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "df = pd.read_csv('knn_test_data',\n",
    "                 index_col=0)  # 而读取csv文件，index_col：我们在读取文件之后所得到的DataFrame的索引默认是0、1、2……，我们可以通过set_index设定索引\n",
    "\n",
    "#1.获取X和y\n",
    "X = df.drop('TARGET CLASS', axis=1)  # 删除含有指定元素的行或列，或删除指定行，列\n",
    "y = df['TARGET CLASS']\n",
    "\n",
    "#2.标准化df的数据部分内容\n",
    "X_arr = StandardScaler().fit_transform(X)  # StandardScaler.transform() 根据均值和方差，将矩阵转标准化\n",
    "X_std = pd.DataFrame(X_arr, columns=df.columns[:-1])  # 创建列表 DataFrame可以设置列名columns与行名index。\n",
    "\n",
    "#3.Train Test Split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_std, y,\n",
    "                                                    test_size=0.30)  # 从样本中随机的按比例选取train data和testdata随机划分训练集和测试集\n",
    "#4.创建KNN模型\n",
    "acc = []\n",
    "for k in range(1, 701):\n",
    "    knn = KNeighborsClassifier(n_neighbors=k)  # k最近邻算法\n",
    "    knn.fit(X_train, y_train)  # 基于特征和分类标签返回分类模型\n",
    "    acc_values = knn.score(X_test, y_test)\n",
    "    acc.append(acc_values)\n",
    "\n",
    "acc = np.array(acc)\n",
    "a = [np.where(acc == acc.max())[0][0] + 1, np.where(acc == acc.max())[0][0] + 1]\n",
    "b = [acc.min(), acc.max()]\n",
    "\n",
    "fig,ax = plt.subplots(figsize=(10,5))\n",
    "plt.plot(a, b, color='cornflowerblue', linewidth=2)\n",
    "plt.plot(np.linspace(1, 700, 700), acc, linestyle='dashed', color='blue',marker='o', markerfacecolor='red', markersize=5)\n",
    "\n",
    "plt.text(np.where(acc == acc.max())[0][0] + 1, acc.max(),\n",
    "         s=f'(k={np.where(acc == acc.max())[0][0] + 1},acc={acc.max()})')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5dc16764-a435-4088-bedd-99d702c5df4f",
   "metadata": {},
   "source": [
    "#### 参考答案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0f4ee4e3-e46d-4ff6-8bef-bc2154060898",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000, 11)\n",
      "处理进度: 100%:  ▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋▋\n",
      " 0.95 10\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.model_selection import train_test_split\n",
    "import sys,time\n",
    "\n",
    "# 一会儿加一个进度条\n",
    "def progress_bar(i):\n",
    "    print(\"\\r\", end=\"\")  # 输出位置回到行首\n",
    "    print(\"处理进度: {}%: \".format(i), \"▋\" * (i // 2), end=\"\")\n",
    "    sys.stdout.flush()  \n",
    "    # time.sleep(0.05) # 程序暂停0.05秒  # <-- 这段代码要注释掉，一定主要不要硬拷贝代码，而要理解!!!\n",
    "\n",
    "# 读取数据\n",
    "df = pd.read_csv(\"knn_test_data\", index_col=0)\n",
    "print(df.shape)\n",
    "\n",
    "# 1. 获取X和y\n",
    "X = df.drop('TARGET CLASS', axis=1)\n",
    "y = df['TARGET CLASS']\n",
    "\n",
    "# 2. 标准化df的数据部分内容【参考: KNN sklearn 过程完善】\n",
    "X_arr = StandardScaler().fit_transform(X)\n",
    "X_std = pd.DataFrame(X_arr,columns=df.columns[:-1])\n",
    "\n",
    "# 3. Train Test Split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_std,y,test_size=0.30) # <-- 此处的随机性会导致什么结果呢？\n",
    "\n",
    "# 4. 创建KNN模型\n",
    "acc_list=[] # 保存所有K对应的准确率 <-- 常用技巧: 用一个空列表用之后记录📝\n",
    "K_max = len(X_train) # 设置测试K的上限 \n",
    "# print(f\"待测试 k 的最大值是: {K_max}\")\n",
    "acc_max=0 # <-- 常用技巧: 用一个可以反复替换的值用来记录最大值 & 或者最大值的索引值\n",
    "K_max_index=0 # 保存最大准确率的K值\n",
    "for K in range(1,K_max+1): # K从1开始取，取到最大值(所以要+1)\n",
    "    progress_bar(K*100//K_max)\n",
    "    # 训练模型\n",
    "    knn = KNeighborsClassifier(n_neighbors=K)\n",
    "    knn.fit(X_train,y_train)\n",
    "\n",
    "    # 5. 获得算法的准确率\n",
    "    acc=knn.score(X_test,y_test)\n",
    "    acc_list.append(acc)\n",
    "    # print(\"当K=\",K,\"的时候此knn模型的准确率为\",acc)\n",
    "    if(acc>acc_max):\n",
    "        acc_max=acc\n",
    "        K_max_index=K\n",
    "\n",
    "print(\"\\n\",acc_max,K_max_index) #因为加了一个进度条，所以该print加一个换行\n",
    "\n",
    "plt.figure(figsize=(20,6))\n",
    "\n",
    "x=range(1,K_max+1) #因为横轴代表K，所以要从1开始取\n",
    "y=acc_list\n",
    "plt.plot(x,y, # 数据部分\n",
    "        color='blue', linestyle='dashed', # 线外观\n",
    "        marker='o', markerfacecolor='red', markersize=5) # 点外观\n",
    "\n",
    "plt.plot([K_max_index,K_max_index],[0,acc_max]) # 画垂线\n",
    "\n",
    "corrd=\"k={0:0.2f}, acc={1:0.2f})\".format(K_max_index,acc_max)\n",
    "plt.text(K_max_index,acc_max,s=corrd) # 在焦点处显示标记\n",
    "\n",
    "plt.show()\n",
    "\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
